주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴
객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴
데코레이터 패턴을 이용해 필요한 추가 기능의 조합을 동적으로 생성할 수 있습니다.
Component와 Deocrator의 조합(Composition)을 통해 ConcreteComponent, ConcreteDecorator 사이의 참조 관계가 이루어집니다.
전자제품과 기타 기기를 가지고 예시를 만들었습니다.
만약 Decorator 패턴을 적용하지 않는다면 Component 밑에 ConcreteComponent로 다 구현해서 다양한 경우의 수가 생길 수 있습니다.
키보드만 쓰는 경우, 키보드-마우스를 쓰는 경우, 키보드-추가 모니터를 쓰는 경우 등등 다양한 경우가 있고 다양한 서브클래스가 발생합니다.
서브클래스가 잦으면 관리가 어렵고, 작성 시 오류가 발생할 확률이 많아집니다.
조합을 이용한 Decorator를 이용할 경우, ConcreteComponent에서 필요한 Decorator를 뽑아쓰는 것으로 대체하여 쉽게 생성, 관리가 가능해집니다.
기본 ConcreteComponent
Computer: LG Laptop
Decorated ConcreteComponent - Computer with Keyboard
Computer: SAMSUNG tablet
Keyboard
Decorated ConcreteComponent - Computer with Keyboard, Monitor
Computer: Macbook
Keyboard
Monitor
위 출력된 부분을 확인하면
Product MonitorKeyboardComputer =
new Monitor(
new Keyboard(
new Computer("Macbook")));
이 경우 다음처럼 가장 안쪽부터 출력됩니다.
Computer: Macbook
Keyboard
Monitor
이는 Decorator의 operation에서 super.operation()
을 한 후, addOperation()
을 하기 때문입니다.
참고
감사합니다.
Text by Chaelin. Photographs by Chaelin, Unsplash.